#include <stdio.h>

int main() {
    const unsigned int a = 60; /* 60 = 0011 1100 */
    const unsigned int b = 13; /* 13 = 0000 1101 */
    int c = 0;

    c = a & b; /* 12 = 0000 1100 */ // & 按位与运算符，两个位都为1时，结果位为1，否则为0；也可理解为位值相同位值不变，位值不同位值取小，也就是取0
    printf("Line 1 - a & b 的值是 %d\n", c);

    c = a | b; /* 61 = 0011 1101 */ // | 按位或运算符，两个位都为0时，结果位为0，否则为1；也可理解为位值相同位值不变，位值不同位值取大，也就是取1
    printf("Line 2 - a | b 的值是 %d\n", c);

    c = a ^ b; /* 49 = 0011 0001 */ // ^ 按位异或运算符，两个位相同为0，不同为1；也可理解为位值相同位值取0，位值不同位值取大，也就是取1
    printf("Line 3 - a ^ b 的值是 %d\n", c);

    c = ~a; /*-61 = 1100 0011 */ // ~ 按位取反运算符，将每个位取反，即0变1，1变0
    printf("Line 4 - ~a 的值是 %d\n", c);

    c = a << 2; /* 240 = 1111 0000 */ // << 左移运算符，将原数的各二进位全部左移若干位，高位丢弃，低位补0；左移 n 位相当于乘以 2 的 n 次方。
    printf("Line 5 - a << 2 的值是 %d\n", c);

    c = a >> 2; /* 15 = 0000 1111 */ // >> 右移运算符，将原数的各二进位全部右移若干位，低位丢弃，高位补0；右移 n 位相当于除以 2 的 n 次方。
    printf("Line 6 - a >> 2 的值是 %d\n", c);

    c = 2 << 2; /* 8 = 0000 1000 */
    printf("Line 7 - 2 << 2 的值是 %d\n", c);

    c = 2 << 3; /* 16 = 0001 0000 */
    printf("Line 8 - 2 << 3 的值是 %d\n", c);

    return 0;
}
